package com.swan.test.freemarker.enums;

import lombok.Getter;
import java.util.Arrays;

@Getter
public enum SexEnum {

    /** M: 男人 */
    MAN("0", "M"),

    /** W: 女人 */
    WOMAN("1", "W"),

    ;

    // 编码
    private String value;

    // 描述
    private String desc;

    SexEnum(String value, String desc) {
        this.value = value;
        this.desc = desc;
    }

    /** 获取枚举值 */
    public String value(){
        return this.value;
    }

    /** 获取枚举描述 */
    public String desc(){
        return this.desc;
    }

    /** 获取 code 对应的枚举类型
     * @param code 枚举值
     * @return 不存在时返回 null
     */
    public static SexEnum ofCode(String code) {
        return Arrays.stream(SexEnum.values())
                .filter(item -> item.value.equals(code))
                .findAny()
                .orElse(null);
    }

    /** 获取 desc 对应的枚举类型
     * @param desc 描述
     * @return 不存在时返回 null
     */
    public static SexEnum ofDesc(String desc) {
        return Arrays.stream(SexEnum.values())
                .filter(item -> item.value.equals(desc))
                .findAny()
                .orElse(null);
    }

    /** 根据 desc 对应的 code
     * @param desc 描述
     * @param defaultCode 默认值
     * @return 不存在时返回默认值
     */
    public static String getValue(String desc, String... defaultCode) {
        SexEnum SexEnum = ofDesc(desc);
        return SexEnum != null ?  SexEnum.getValue() : defaultCode.length > 0 ? defaultCode[0] : null;
    }

    /** 根据 code 对应的 desc
     * @param code 编码
     * @param defaultDesc 默认值
     * @return 不存在时返回默认值
     */
    public static String getDesc(String code, String... defaultDesc) {
        SexEnum SexEnum = ofCode(code);
        return SexEnum != null ?  SexEnum.getDesc() : defaultDesc.length > 0 ? defaultDesc[0] : null;
    }

}
